package aliyun

import (
	"fmt"
	"mime/multipart"
	"os"
	"tiktok2023/store"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

var (
	// 对象是否实现了接口的约束
	_ store.Uploader = &AliOssStore{}
)

type AliOssStore struct {
	// 阿里云 OSS client， 私有变量，不运行外部
	client *oss.Client
}

type Options struct {
	Endpoint      string
	AccessKey     string
	AccessSercret string
}

// 校验账户是否正确
func (o *Options) validate() error {
	if o.Endpoint == "" || o.AccessKey == "" || o.AccessSercret == "" {
		return fmt.Errorf("endpint,acessKey,acessSecret is empty")
	}
	return nil
}

// AliOssStore 对象的构造
func NewAliOssStore(opts *Options) (*AliOssStore, error) {

	if err := opts.validate(); err != nil {
		return nil, err
	}

	c, err := oss.New(opts.Endpoint, opts.AccessKey, opts.AccessSercret)
	if err != nil {
		return nil, err
	}

	return &AliOssStore{
		client: c,
	}, nil
}

// 默认代理给外界使用
func NewDefaultNewAliOssStore() (*AliOssStore, error) {
	return NewAliOssStore(&Options{
		Endpoint:      os.Getenv("ALI_OSS_ENDPOINT"),
		AccessKey:     os.Getenv("ALI_AK"),
		AccessSercret: os.Getenv("ALI_SK"),
	})
}

func (s *AliOssStore) Upload(bucketName string, objectKey string, file *multipart.FileHeader) (string, error) {

	// 1、打开上传的文件
	uploadedFile, err := file.Open()
	if err != nil {
		return "", err
	}
	defer uploadedFile.Close()

	// 2、获取 bucket 对象
	bucket, err := s.client.Bucket(bucketName)
	if err != nil {
		return "", err
	}
	// 3、上传文件到该 bucket
	if err := bucket.PutObject(objectKey, uploadedFile); err != nil {
		return "", err
	}

	// 4、打印下载链接
	downloadURL, err := bucket.SignURL(objectKey, oss.HTTPGet, 60*60*24*7)
	if err != nil {
		return "", err
	}
	fmt.Printf("文件下载URL：%s\n", downloadURL)
	fmt.Println("请在一天内下载")

	return downloadURL, nil
}

// 生成视频封面带签名的URL
// func (s *AliOssStore) GenerateCoverURL(bucketName string, objectKey string, timeInMilliseconds int64) (string, error) {
// 	expiration := 600 // 10分钟有效期（秒）
// 	style := fmt.Sprintf("video/snapshot,t_%d,f_jpg,w_800,h_600,m_fast", timeInMilliseconds)

// 	// 生成带签名的URL
// 	signedURL, err := s.client.SignURL(bucketName, objectKey, oss.HTTPGet, expiration, oss.Process(style))
// 	if err != nil {
// 		return "", err
// 	}

// 	return signedURL, nil

// // 构造视频截帧URL，设置截取时间、图片格式、宽度、高度等参数

// // 这里以截取视频17秒处的封面为例，图片格式为JPG，宽度为800，高度为600
// snapshotURL := fmt.Sprintf(
// 	"%s?x-oss-process=video/snapshot,t_17000,f_jpg,w_800,h_600,m_fast",
// 	videoURL,
// )

// // 生成带签名的URL，指定过期时间为10分钟
// expiration := time.Now().Add(60 * time.Minute * 24 * 7)
// options := []oss.Option{
// 	oss.Process(style),
// }
// signedURL, err := s.client.SignURL("your_bucket_name", "your_object_name", expiration, options...)
// if err != nil {
// 	return "", err
// }

// // 返回带签名的视频截帧URL
// return signedURL, nil
// }
